package net.huashitong.ssydt.provider.sys.service;


import net.huashitong.ssydt.PaginationResult;
import net.huashitong.ssydt.exceptions.ParamErrorServiceException;
import net.huashitong.ssydt.exceptions.ServiceException;
import net.huashitong.ssydt.provider.sys.mapper.SsSysBasMapper;
import net.huashitong.ssydt.sys.entity.SsSysBas;
import net.huashitong.ssydt.sys.entity.vo.SsSysBasNewTypeVO;
import net.huashitong.ssydt.sys.entity.vo.SsSysBasQueryInVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * @author huiyang.yu
 */
@Service
@Transactional
public class SsSysBasServiceImpl implements SsSysBasService {

	private SsSysBasMapper ssSysBasMapper;

	@Autowired
	public SsSysBasServiceImpl(SsSysBasMapper ssSysBasMapper) {
		this.ssSysBasMapper = ssSysBasMapper;
	}

	@Override
	public List<SsSysBas> queryByBasType(String basType) {
		return this.ssSysBasMapper.queryByBasType(basType);
	}

	@Override
	public List<SsSysBas> queryNotTypeByBasType(String basType) {
		return this.ssSysBasMapper.queryNotTypeByBasType(basType);
	}

	@Override
	public List<SsSysBas> queryNotTypeByBasTypeAndAttr1(String basType, String attr1) {
		SsSysBas ssSysBas = new SsSysBas();
		ssSysBas.setBasType(basType);
		ssSysBas.setAttr1(attr1);
		return this.ssSysBasMapper.queryNotTypeByBasTypeAndAttr1(ssSysBas);
	}

	@Override
	public SsSysBas getByBasTypeAndDictValue(String basType, String dictValue) {
		SsSysBas ssSysBas = new SsSysBas();
		ssSysBas.setBasType(basType);
		ssSysBas.setDictValue(dictValue);
		ssSysBas = this.ssSysBasMapper.getByBasTypeAndDictValue(ssSysBas);
		return ssSysBas;
	}

	@Override
	public PaginationResult<SsSysBas> paginationQuery(SsSysBasQueryInVO ssSysBasQueryInVO) {
		PaginationResult result = new PaginationResult();
		result.setPageNumber(ssSysBasQueryInVO.getPageNumber());
		result.setPageSize(ssSysBasQueryInVO.getPageSize());

		// 查询记录总数
		int total = ssSysBasMapper.queryCount(ssSysBasQueryInVO);
		result.setPageRecords(total);

		if (total == 0) {
			result.setList(new ArrayList());
		} else {
			// 查询当前页记录
			List<SsSysBas> list = ssSysBasMapper.query(ssSysBasQueryInVO);
			result.setList(list);
		}
		return result;
	}

	@Override
	public void addSysBas(SsSysBas ssSysBas) {
		checkParameters(ssSysBas);

		SsSysBasQueryInVO ssSysBasQueryInVO = new SsSysBasQueryInVO();
		ssSysBasQueryInVO.setBasType(ssSysBas.getBasType());
		ssSysBasQueryInVO.setDictValue(ssSysBas.getDictValue());
		int test = ssSysBasMapper.queryCount(ssSysBasQueryInVO);
		if (test != 0) {
			throw new ServiceException("系统参数已存在");
		}
		if (!"00".equals(ssSysBas.getDictValue())) {
			ssSysBasQueryInVO.setDictValue("00");
			test = ssSysBasMapper.queryCount(ssSysBasQueryInVO);
			if (test == 0) {
				throw new ServiceException("请先添加相关参数类型");
			}
		}
		ssSysBasMapper.insert(ssSysBas);
	}

	@Override
	public void updateSysBas(SsSysBas ssSysBas) {
		checkParameters(ssSysBas);

		SsSysBas raw = ssSysBasMapper.selectByPrimaryKey(ssSysBas.getId());
		if (raw == null) {
			throw new ServiceException("系统参数不存在");
		}

		// 当 isFixed 为 1 时禁止修改类型与字典值
		if (1 == raw.getIsFixed()) {
			ssSysBas.setBasType(raw.getBasType());
			ssSysBas.setDictValue(raw.getDictValue());
		}

		// 主类禁止修改字典值
		else if ("00".equals(raw.getDictValue())) {
			ssSysBas.setDictValue(raw.getDictValue());
		}

		// 子类禁止修改所属主类型
		else {
			ssSysBas.setBasType(raw.getBasType());
		}

		// 当修改了主类型或字典值时，判断新值是否已经存在于系统之中
		if (!raw.getBasType().equals(ssSysBas.getBasType()) || !raw.getDictValue().equals(ssSysBas.getDictValue())) {
			SsSysBasQueryInVO ssSysBasQueryInVO = new SsSysBasQueryInVO();
			ssSysBasQueryInVO.setBasType(ssSysBas.getBasType());
			ssSysBasQueryInVO.setDictValue(ssSysBas.getDictValue());
			int test = ssSysBasMapper.queryCount(ssSysBasQueryInVO);
			if (test != 0) {
				throw new ServiceException("系统参数已存在");
			}
		}

		ssSysBasMapper.updateByPrimaryKeySelective(ssSysBas);

		// 当修改主类型且主类型名称被修改时，同时修改子类（字典）的所属主类
		if ("00".equals(raw.getDictValue()) && !raw.getBasType().equals(ssSysBas.getBasType())) {
			SsSysBasNewTypeVO ssSysBasNewTypeVO = new SsSysBasNewTypeVO();
			ssSysBasNewTypeVO.setBasType(raw.getBasType());
			ssSysBasNewTypeVO.setNewBasType(ssSysBas.getBasType());
			ssSysBasMapper.updateBasType(ssSysBasNewTypeVO);
		}
	}

	@Override
	public void deleteSysBas(Long id) {
		SsSysBas ssSysBas = ssSysBasMapper.selectByPrimaryKey(id);
		if (ssSysBas == null) {
			return; // 不存在该条记录，默认为已删除
		}

		// "00" 为类型定义，删除类型之前必须先删除类型下的所属字典参数定义
		if ("00".equals(ssSysBas.getDictValue())) {
			SsSysBasQueryInVO ssSysBasQueryInVO = new SsSysBasQueryInVO();
			ssSysBasQueryInVO.setBasType(ssSysBas.getBasType());
			int test = ssSysBasMapper.queryCount(ssSysBasQueryInVO);
			if (test > 1) {
				throw new ServiceException("删除失败，请先删除该类型下的字典参数");
			}
		}

		ssSysBasMapper.deleteByPrimaryKey(id);
	}

	private void checkParameters(SsSysBas ssSysBas) {
		switch (ssSysBas.getIsFixed()) {
			case 0:
			case 1:
				break;
			default:
				throw new ParamErrorServiceException("是否固定输入参数错误");
		}
	}
}
